أقوم بإدراج جهات الاتصال من خدمة الويب وعرضها في جدول جهات الاتصال "المقسم" كما هو موضح في لقطة الشاشة. المشكلة هي أنني أحصل على نفس قيم العلامات لمربعات الاختيار للصف الأول للقسم A وكذلك القسم S. لقد قمت بفرز مصفوفة واحدة وعرضها في طريقة عرض الجدول المفهرس. كيفية الحصول على قيم علامات مختلفة اعتمادًا على indexPath.row بغض النظر عن عدد الأقسام المعروضة. هذا ما حاولت في cellForRowAtIndexPath: UIButton * checkBox ؛ إذا (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone) { checkBox = [[UIButton تخصيص] initWithFrame: CGRectMake (7، 8، 30، 30)]؛ } آخر { checkBox = [[زر تخصيص UIButton] initWithFrame: CGRectMake (15، 13، 30، 30)]؛ } // int cnt = 0 ؛ // لـ (int i = indexPath.section - 1 ؛ i> 0 ؛ i--) // { // cnt + = [[objectForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count] ؛ يحتوي // arrayOfCharachters على أحرف من "A" إلى "Z" //} //checkBox.tag = cnt + indexPath.row ؛ [checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]؛ [checkBox addTarget: self action:selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside]؛ [checkBox setTag: indexPath.row] ؛ [cell.contentView addSubview: checkBox] ؛ خلية عائدة } - (باطل) checkBoxClicked: (معرف) المرسل { CGPoint buttonPosition = [تحويل المرسل: CGPointZero toView: self.tableViewContact] ؛ NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition] ؛ UIButton * tappedButton = (UIButton *) المرسل ؛ NSLog (@ "Tag number =٪ d"، [علامة المرسل]) ؛ إذا ([tappedButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]]) { [sender setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal]؛ إذا (indexPath! = لا شيء) { NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row] ؛ // تخزين معرفات خانة الاختيار في mutableArrayOfIds NSLog (@ "معرّف الزر الذي تم وضع علامة عليه =٪ @" ، finalIntId) ؛ [arrayOfIds addObject: finalIntId] ؛ } // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: tappedButton.tag] ؛ // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row] ؛ } آخر { [sender setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]؛ NSLog (@ "UnChecked") ؛ // [arrayOfIds removeObjectAtIndex: tappedButton.tag] ؛ } } - (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) section { إذا ([عدد arrayOfCharacters] == 0) { إرجاع @""؛ } إرجاع [NSString stringWithFormat: @ "٪ @"، [arrayOfCharacters objectAtIndex: section]]؛ } - (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView { NSArray * toBeReturned = [NSArray arrayWithArray: [@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | # " مكونات SeparatedByString: @ "|"]]؛ العودة إلى } - (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) title atIndex: (NSInteger) index { عدد NSInteger = 0 ؛ لـ (NSString * حرف في arrayOfCharacters) { إذا ([character isEqualToString: title]) { عدد العودة } العد ++ ؛ } العودة 0 ؛ } - (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView { إرجاع [عدد arrayOfCharacters] ؛ // إرجاع 1 ؛ } - (NSInteger) عرض الجدول: (UITableView *) الجدول عرض رقمالصفوفإنسيتيكشن: (NSInteger) القسم { // return [mutableArray count] ؛ إرجاع [[objectForCharacters objectForKey: [arrayOfCharacters objectAtIndex: section]] count]؛ }
2020-12-07 22:53:48
أنت تقوم بتعيين نفس قيمة العلامة لجميع الأقسام التي لها نفس الصف. يحتوي indexPath على خاصيتين ، {section، row}. لنفترض أن القسم أ يحتوي على صفين ، للصف 1 -> indexPath.section = 0 ، indexPath.row = 0 ؛ لـ row2-> indexPath.section = 0 ، indexPath.row = 1 ؛ لنفترض أن القسم S يحتوي على صفين ، للصف 1 -> indexPath.section = 1 ، indexPath.row = 0 ؛ لـ row2-> indexPath.section = 1 ، indexPath.row = 1 ؛ لذلك ، بالنسبة للصف 1 من القسم A والصف 1 من القسم S ، فأنت تقوم بتعيين نفس قيمة العلامة وهي 0. هناك مشكلتك. حاول تعيين قيمة العلامة مثل أدناه. button.tag = indexPath.section * 1000 + indexPath.row ؛ عند استرجاع القسم والصف ، قسم NSInteger = (button.tag) / 1000 ؛ NSInteger row = (button.tag)٪ 1000 ؛ | جرب هذا... - (UITableViewCell *) عرض الجدول: (UITableView *) جدول عرض خلية { ثابت NSString * CellIdentifier = @ "Cell" ؛ UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier] ؛ إذا (الخلية == لا شيء) { خلية = [[تخصيص UITableViewCell] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier] ؛ } UIButton * checkBox = [[تخصيص UIButton] initWithFrame: CGRectMake (280، 10، 50، 44)]؛ checkBox.backgroundColor = [UIColor orangeColor] ، [checkBox addTarget: self action:selector (checkBoxClicked: event:) forControlEvents: UIControlEventTouchUpInside]؛ [checkBox setTag: indexPath.row] ؛ [cell.contentView addSubview: checkBox] ؛ خلية عائدة } - (باطل) checkBoxClicked: حدث المرسل (معرف): حدث (معرف) { NSSet * touches = [حدث allTouches] ؛ UITouch * touch = [touches anyObject] ؛ CGPoint currentTouchPosition = [touch locationInView: self.tv] ؛ // هنا التلفزيون هو كائن TableView NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition] ، NSLog (@ "قيمة indePath.section٪ d ، indexPath.row٪ d" ، indexPath.section ، indexPath.row) ؛ } | يحدث هذا لأنك تقوم بتعيين علامة إلى الأزرار المستقلة من الأقسام. يحتوي كل من الصف الأول من القسمين A & S على صف = 0. لذا فإن العلامة المعينة إلى الزر الخاص بهما هي 0. يجب عليك تعيينها مع الاحتفاظ بالإشارة إلى الأقسام الخاصة بك. أود أن أقترح تعيين تلميح إمكانية الوصول باستخدام نموذج مفصول بفاصلة يحتوي على قسم ، صف. وفي طريقتك - (باطل) checkBoxClicked: (معرف) المرسل { // اختر سلسلة من نموذج مفصول بفاصلة. الأول هو القسم الخاص بك ، والثاني هو الصف. } الخيار الثاني هو القيام بما تفعله وتنفيذ طريقة Button الخاصة بك مثل هذا. CGPoint buttonPosition = [تحويل المرسل: CGPointZero toView: self.tableView] ؛ NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition] ؛ إذا (indexPath! = لا شيء) { ... indexpath.section هو القسم الخاص بك ، والفهرس path.row هو صفك. } هناك الخيار الثالث كذلك. في cellforRowAtIndexpath ، قم بتعيين عنوان الزر الخاص بك - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath [btn setTitle: <# Your Row #> forState: UIControlStateDisabled]؛ [btn setTag <#Your Section #>] ؛ لذلك عند الاستلام في أسلوب الزر الخاص بك ، يمكنك الحصول على كل من القسم (العلامة) والصف (عنوان الحالة المعطلة). - (باطل) checkBoxClicked: (المعرف) المرسل {[button titleForState: UIControlStateDisabled] ؛ // صفك button.tag // قسمك} | جرب هذا! كل قسم قد تعرف عدد الأقسام بشكل صحيح ، ثم أضف عدد الصف الفردي. [[fieldTitlesList objectAtIndex: indexPath.section - 1] count] + indexPath.row حيث يمثل fieldTitlesList مجموعة أقسامك. | لقد أضفت الكود التالي الذي حل مشكلتي NSInteger rowNumber = 0 ؛ لـ (NSInteger i = 0 ؛ i